Uzziniet, kÄ izstrÄdÄt un veidot jaudÄ«gas OLAP sistÄmas un datu noliktavas, izmantojot Python. Å is ceļvedis aptver visu, sÄkot no datu modelÄÅ”anas un ETL lÄ«dz piemÄrotÄko rÄ«ku izvÄlei, piemÄram, Pandas, Dask un DuckDB.
Python datu noliktava: visaptveroÅ”s OLAP sistÄmu projektÄÅ”anas ceļvedis
MÅ«sdienu datu vadÄ«tajÄ pasaulÄ spÄja Ätri analizÄt milzÄ«gu informÄcijas apjomu nav tikai konkurences priekÅ”rocÄ«ba; tÄ ir nepiecieÅ”amÄ«ba. UzÅÄmumi visÄ pasaulÄ paļaujas uz spÄcÄ«gu analÄ«tiku, lai izprastu tirgus tendences, optimizÄtu darbÄ«bas un pieÅemtu stratÄÄ£iskus lÄmumus. Å Ä«s analÄ«tiskÄs spÄjas pamatÄ ir divi pamata jÄdzieni: Datu noliktava (DWH) un TieÅ”Äs analÄ«tiskÄs apstrÄdes (OLAP) sistÄmas.
TradicionÄli Å”o sistÄmu izveidei bija nepiecieÅ”ama specializÄta, bieži vien patentÄta un dÄrga programmatÅ«ra. TomÄr atvÄrtÄ pirmkoda tehnoloÄ£iju pieaugums ir demokratizÄjis datu inženieriju. Å o virzÄ«bu vada Python, daudzpusÄ«ga un jaudÄ«ga valoda ar bagÄtÄ«gu ekosistÄmu, kas padara to par izcilu izvÄli galveno datu risinÄjumu veidoÅ”anai. Å is ceļvedis sniedz visaptveroÅ”u pÄrskatu par datu noliktavu un OLAP sistÄmu projektÄÅ”anu un ievieÅ”anu, izmantojot Python krÄtuvi, kas pielÄgota globÄlai datu inženieru, arhitektu un izstrÄdÄtÄju auditorijai.
1. daļa: Business Intelligence stÅ«rakmeÅi - DWH un OLAP
Pirms iedziļinÄties Python kodÄ, ir ļoti svarÄ«gi saprast arhitektÅ«ras principus. IzplatÄ«ta kļūda ir mÄÄ£inÄt veikt analÄ«zi tieÅ”i operatÄ«vajÄs datubÄzÄs, kas var radÄ«t zemu veiktspÄju un neprecÄ«zus ieskatus. Å Ä« ir problÄma, ko datu noliktavas un OLAP tika izstrÄdÄtas, lai atrisinÄtu.
Kas ir Datu noliktava (DWH)?
Datu noliktava ir centralizÄts krÄtuve, kas glabÄ integrÄtus datus no viena vai vairÄkiem atŔķirÄ«giem avotiem. TÄs galvenais mÄrÄ·is ir atbalstÄ«t Business Intelligence (BI) darbÄ«bas, Ä«paÅ”i analÄ«tiku un pÄrskatu sagatavoÅ”anu. DomÄjiet par to kÄ par vienoto patiesÄ«bas avotu organizÄcijas vÄsturiskajiem datiem.
TÄ ir stingrÄ pretstatÄ TieÅ”Äs transakciju apstrÄdes (OLTP) datubÄzei, kas nodroÅ”ina ikdienas lietojumprogrammu darbÄ«bu (piemÄram, e-komercijas kases sistÄmu vai bankas transakciju reÄ£istru). Å eit ir Ätra salÄ«dzinÄjums:
- Darba slodze: OLTP sistÄmas apstrÄdÄ lielu skaitu mazu, Ätru transakciju (lasīŔanas, ievietoÅ”anas, atjauninÄÅ”anas). DWH ir optimizÄtas mazÄkam skaitam sarežģītu, ilgstoÅ”u vaicÄjumu, kas skenÄ miljoniem ierakstu (daudz lasīŔanas).
- Datu struktÅ«ra: OLTP datubÄzes ir augsti normalizÄtas, lai nodroÅ”inÄtu datu integritÄti un izvairÄ«tos no redundances. DWH bieži vien tiek denormalizÄtas, lai vienkÄrÅ”otu un paÄtrinÄtu analÄ«tiskos vaicÄjumus.
- MÄrÄ·is: OLTP ir biznesa darbÄ«bas nodroÅ”inÄÅ”anai. DWH ir biznesa analÄ«zei.
Labi izstrÄdÄtu DWH raksturo Äetras galvenÄs Ä«paŔības, ko bieži piedÄvÄ pionierim Bilam Inmonam:
- TÄmai orientÄts: Dati tiek organizÄti ap galvenajÄm biznesa tÄmÄm, piemÄram, 'Klientu', 'Produktu' vai 'PÄrdoÅ”anu', nevis lietojumprogrammu procesiem.
- IntegrÄts: Dati tiek savÄkti no dažÄdiem avotiem un integrÄti konsekventÄ formÄtÄ. PiemÄram, 'USA', 'United States' un 'U.S.' var tikt standartizÄti uz vienu 'United States' ierakstu.
- Laikam pakļauts: noliktavÄ esoÅ”ie dati atspoguļo informÄciju ilgu laika periodu (piemÄram, 5-10 gadus), kas ļauj veikt vÄsturiskas analÄ«zes un tendenÄu identificÄÅ”anu.
- NeizturÄ«gs: Kad dati ir ielÄdÄti noliktavÄ, tie reti vai nekad netiek atjauninÄti vai dzÄsti. Tas kļūst par pastÄvÄ«gu vÄsturisko notikumu ierakstu.
Kas ir OLAP (TieÅ”Äs analÄ«tiskÄs apstrÄdes)?
Ja DWH ir vÄsturisko datu bibliotÄka, tad OLAP ir jaudÄ«gÄ meklÄtÄjprogramma un analÄ«zes rÄ«ks, kas ļauj to izpÄtÄ«t. OLAP ir programmatÅ«ras tehnoloÄ£iju kategorija, kas ļauj lietotÄjiem Ätri analizÄt informÄciju, kas ir apkopota daudzdimensiju skatos, kas pazÄ«stami kÄ OLAP kubi.
OLAP kubs ir OLAP konceptuÄlÄ sirds. TÄ ne vienmÄr ir fiziska datu struktÅ«ra, bet gan veids, kÄ modelÄt un vizualizÄt datus. Kubs sastÄv no:
- MÄrvienÄ«bas: Å ie ir kvantitatÄ«vi, skaitliski datu punkti, kurus vÄlaties analizÄt, piemÄram, 'IeÅÄmumi', 'PÄrdotais daudzums' vai 'PeļÅa'.
- Dimensijas: Å ie ir kategoriskie atribÅ«ti, kas apraksta mÄrvienÄ«bas, sniedzot kontekstu. KopÄ«gas dimensijas ietver 'Laiks' (gads, ceturksnis, mÄnesis), 'Ä¢eogrÄfija' (valsts, reÄ£ions, pilsÄta) un 'Produkts' (kategorija, zÄ«mols, SKU).
IedomÄjieties pÄrdoÅ”anas datu kubu. JÅ«s varÄtu aplÅ«kot kopÄjos ieÅÄmumus (mÄrvienÄ«ba) dažÄdÄs dimensijÄs. Izmantojot OLAP, jÅ«s varat veikt jaudÄ«gas darbÄ«bas ar Å”o kubu ar neticamu Ätrumu:
- Slice: Kubu dimensiju skaita samazinÄÅ”ana, izvÄloties vienu vÄrtÄ«bu vienai dimensijai. PiemÄrs: PÄrdoÅ”anas datu aplÅ«koÅ”ana tikai '2023. gada 4. ceturksnim'.
- Dice: ApakÅ” kuba atlase, norÄdot vÄrtÄ«bu diapazonu vairÄkÄm dimensijÄm. PiemÄrs: PÄrdoÅ”anas aplÅ«koÅ”ana 'Elektronikai' un 'ApÄ£Ärbam' (Produkta dimensija) 'EiropÄ' un 'ÄzijÄ' (Ä¢eogrÄfijas dimensija).
- Drill-Down / Drill-Up: NavigÄcija pa detalizÄcijas lÄ«meÅiem dimensijas ietvaros. Drill-down pÄriet no augstÄka lÄ«meÅa kopsavilkumiem uz zemÄka lÄ«meÅa detaļÄm (piemÄram, no 'Gada' uz 'Ceturksni' uz 'MÄnesi'). Drill-up (vai roll-up) ir pretÄji.
- Pivot: Kubu asiÅu pagrieÅ”ana, lai iegÅ«tu jaunu datu skatÄ«jumu. PiemÄrs: 'Produkta' un 'Ä¢eogrÄfijas' asiÅu apmaiÅa, lai redzÄtu, kuri reÄ£ioni pÄrk kurus produktus, nevis kuri produkti tiek pÄrdoti kuros reÄ£ionos.
OLAP sistÄmu tipi
Ir trÄ«s galvenie OLAP sistÄmu arhitektÅ«ras modeļi:
- MOLAP (Multidimensional OLAP): Å is ir "klasiskais" kuba modelis. Dati tiek izgÅ«ti no DWH un iepriekÅ” apkopoti patentÄtÄ, daudzdimensiju datubÄzÄ. PriekÅ”rocÄ«bas: ÄrkÄrtÄ«gi Ätrs vaicÄjumu veiktspÄja, jo visas atbildes ir iepriekÅ” aprÄÄ·inÄtas. TrÅ«kumi: Var radÄ«t "datu eksploziju", jo iepriekÅ” apkopoto Ŕūnu skaits var kļūt milzÄ«gs, un tas var bÅ«t mazÄk elastÄ«gs, ja jums ir jÄuzdod jautÄjums, kas nebija paredzÄts.
- ROLAP (Relational OLAP): Å is modelis saglabÄ datus attiecÄ«bu datubÄzÄ (parasti paÅ”Ä DWH) un izmanto sarežģītu metadatu slÄni, lai OLAP vaicÄjumus pÄrvÄrstu par standarta SQL. PriekÅ”rocÄ«bas: Augsti mÄrogojams, jo tas izmanto moderno attiecÄ«bu datubÄzu jaudu un var vaicÄt detalizÄtÄkus, reÄllaika datus. TrÅ«kumi: VaicÄjumu veiktspÄja var bÅ«t lÄnÄka nekÄ MOLAP, jo apkopojumi tiek veikti tieÅ”i.
- HOLAP (Hybrid OLAP): Å Ä« pieeja cenÅ”as apvienot labÄko no abÄm pasaulÄm. TÄ uzglabÄ augsta lÄ«meÅa apkopotus datus MOLAP stila kubÄ Ätrumam un glabÄ detalizÄtus datus ROLAP attiecÄ«bu datubÄzÄ detalizÄtai analÄ«zei.
MÅ«sdienu datu krÄvÄm, kas veidotas ar Python, robežas ir izplÅ«duÅ”as. Ar neticami Ätriem kolonnu datubÄzu parÄdīŔanos ROLAP modelis ir kļuvis dominÄjoÅ”s un ļoti efektÄ«vs, bieži vien nodroÅ”inot veiktspÄju, kas konkurÄ ar tradicionÄlajÄm MOLAP sistÄmÄm bez stingrÄ«bas.
2. daļa: Python ekosistÄma datu noliktavai
KÄpÄc izvÄlÄties Python uzdevumam, ko tradicionÄli dominÄ uzÅÄmumu BI platformas? Atbilde slÄpjas tÄs elastÄ«gumÄ, jaudÄ«gajÄ ekosistÄmÄ un spÄjÄ apvienot visu datu dzÄ«ves ciklu.
KÄpÄc Python?
- Apvienota valoda: JÅ«s varat izmantot Python datu izguvei (ETL), transformÄcijai, ielÄdei, orÄ·estrÄÅ”anai, analÄ«zei, maŔīnmÄcÄ«bai un API izstrÄdei. Tas samazina sarežģītÄ«bu un nepiecieÅ”amÄ«bu pÄc konteksta pÄrslÄgÅ”anas starp dažÄdÄm valodÄm un rÄ«kiem.
- PlaÅ”a bibliotÄku ekosistÄma: Python ir nobrieduÅ”as, kaujas pÄrbaudÄ«tas bibliotÄkas katram procesa posmam, sÄkot no datu manipulÄcijas (Pandas, Dask) lÄ«dz datubÄzes mijiedarbÄ«bai (SQLAlchemy) un darba plÅ«smas pÄrvaldÄ«bai (Airflow, Prefect).
- PiegÄdÄtÄjam neitrÄls: Python ir atvÄrtÄ pirmkoda un savieno visu. NeatkarÄ«gi no tÄ, vai jÅ«su dati atrodas PostgreSQL datubÄzÄ, Snowflake noliktavÄ, S3 datu ezerÄ vai Google Sheet, ir pieejama Python bibliotÄka, lai tos piekļūtu.
- MÄrogojamÄ«ba: Python risinÄjumi var mÄrogot no vienkÄrÅ”a skripta, kas darbojas klÄpjdatorÄ, lÄ«dz izplatÄ«tai sistÄmai, kas apstrÄdÄ petabaitus datu mÄkoÅu klasterÄ«, izmantojot tÄdus rÄ«kus kÄ Dask vai Spark (caur PySpark).
GalvenÄs Python bibliotÄkas datu noliktavas krÄvai
Tipisks Python balstÄ«ts datu noliktavas risinÄjums nav viens produkts, bet gan kurÄta spÄcÄ«gu bibliotÄku kolekcija. Å eit ir nepiecieÅ”amÄ«bas:
ETL/ELT (IzgÅ«t, TransformÄt, IelÄdÄt)
- Pandas: De facto standarts datu manipulÄcijai atmiÅÄ Python valodÄ. IdeÄli piemÄrots nelielu un vidÄju datu kopu (lÄ«dz dažiem gigabaitiem) apstrÄdei. TÄ DataFrame objekts ir intuitÄ«vs un jaudÄ«gs datu tÄ«rīŔanai, transformÄÅ”anai un analÄ«zei.
- Dask: ParalÄlÄs skaitļoÅ”anas bibliotÄka, kas mÄrogo jÅ«su Python analÄ«tiku. Dask nodroÅ”ina paralÄlu DataFrame objektu, kas atdarina Pandas API, bet var darboties ar datu kopÄm, kas ir lielÄkas par atmiÅu, sadalot tÄs gabalos un apstrÄdÄjot paralÄli vairÄkiem kodoliem vai maŔīnÄm.
- SQLAlchemy: Galvenais SQL rÄ«ku komplekts un objektu-attiecÄ«bu kartÄtÄjs (ORM) Python valodai. Tas nodroÅ”ina konsekventu, augsta lÄ«meÅa API savienoÅ”anai ar gandrÄ«z jebkuru SQL datubÄzi, sÄkot no SQLite lÄ«dz uzÅÄmuma lÄ«meÅa noliktavÄm, piemÄram, BigQuery vai Redshift.
- Darba plÅ«smas orÄ·estrÄtÄji (Airflow, Prefect, Dagster): Datu noliktava netiek veidota uz viena skripta. TÄ ir virkne atkarÄ«gu uzdevumu (izgÅ«t no A, transformÄt B, ielÄdÄt uz C, pÄrbaudÄ«t D). OrÄ·estrÄtÄji ļauj definÄt Ŕīs darba plÅ«smas kÄ virzÄ«tos akikliskos grafus (DAG), plÄnojot, uzraugot un atkÄrtoti mÄÄ£inot tos ar izturÄ«bu.
Datu glabÄÅ”anai un apstrÄdei
- MÄkoÅu DWH savienotÄji: BibliotÄkas, piemÄram,
snowflake-connector-python,google-cloud-bigqueryunpsycopg2(Redshift un PostgreSQL), nodroÅ”ina netraucÄtu mijiedarbÄ«bu ar galvenajÄm mÄkoÅu datu noliktavÄm. - PyArrow: BÅ«tiski svarÄ«ga bibliotÄka, kas strÄdÄ ar kolonnu datu formÄtiem. TÄ nodroÅ”ina standartizÄtu atmiÅÄ esoÅ”o formÄtu un nodroÅ”ina Ätru datu pÄrsÅ«tīŔanu starp sistÄmÄm. TÄ ir efektÄ«vas mijiedarbÄ«bas ar formÄtiem, piemÄram, Parquet, dzinÄjspÄks.
- ModernÄs datu ezera bibliotÄkas: Uzlabotiem iestatÄ«jumiem bibliotÄkas, piemÄram,
deltalake,py-icebergun - Spark lietotÄjiem - PySpark's vietÄjais atbalsts Å”iem formÄtiem ļauj Python veidot uzticamus, transakcionÄlus datu ezerus, kas kalpo par noliktavas pamatu.
3. daļa: OLAP sistÄmas projektÄÅ”ana ar Python
Tagad pÄriesim no teorijas uz praksi. Å eit ir soli pa solim ceļvedis jÅ«su analÄ«tiskÄs sistÄmas projektÄÅ”anai.
1. solis: Datu modelÄÅ”ana analÄ«zei
Jebkuras labas OLAP sistÄmas pamats ir tÄs datu modelis. MÄrÄ·is ir strukturÄt datus Ätrai, intuitÄ«vai vaicÄÅ”anai. VisizplatÄ«tÄkie un efektÄ«vÄkie modeļi ir zvaigžÅu shÄma un tÄs variants, sniega pÄrslietas shÄma.
ZvaigžÅu shÄma pret sniega pÄrslietas shÄmu
ZvaigžÅu shÄma ir visplaÅ”Äk izmantotÄ struktÅ«ra datu noliktavÄm. TÄ sastÄv no:
- CentrÄlÄ Faktu tabula: Satur mÄrvienÄ«bas (ciparus, kurus vÄlaties analizÄt) un ÄrÄjos atslÄgus uz dimensiju tabulÄm.
- VairÄkas Dimensiju tabulas: Katra dimensiju tabula ir savienota ar faktu tabulu ar vienu atslÄgu un satur aprakstoÅ”os atribÅ«tus. Å Ä«s tabulas ir augsti denormalizÄtas vienkÄrŔībai un Ätrumam.
PiemÄrs: `FactSales` tabula ar kolonnÄm, piemÄram, `DateKey`, `ProductKey`, `StoreKey`, `QuantitySold` un `TotalRevenue`. TÄ bÅ«tu apÅemta ar `DimDate`, `DimProduct` un `DimStore` tabulÄm.
Sniega pÄrslietas shÄma ir zvaigžÅu shÄmas paplaÅ”inÄjums, kurÄ dimensiju tabulas tiek normalizÄtas vairÄkÄs saistÄ«tÄs tabulÄs. PiemÄram, `DimProduct` tabula varÄtu tikt sadalÄ«ta `DimProduct`, `DimBrand` un `DimCategory` tabulÄs.
Ieteikums: SÄciet ar ZvaigžÅu shÄmu. VaicÄjumi ir vienkÄrÅ”Äki (mazÄk savienojumu), un modernÄs kolonnu datubÄzes ir tik efektÄ«vas plaÅ”u, denormalizÄtu tabulu apstrÄdÄ, ka sniega pÄrslietu shÄmu glabÄÅ”anas ieguvumi bieži vien ir niecÄ«gi salÄ«dzinÄjumÄ ar papildu savienojumu veiktspÄjas izmaksÄm.
2. solis: ETL/ELT cauruļvada izveide Python valodÄ
ETL process ir mugurkauls, kas nodroÅ”ina jÅ«su datu noliktavu. Tas ietver datu izgūŔanu no avota sistÄmÄm, to pÄrveidoÅ”anu tÄ«rÄ un konsekventÄ formÄtÄ un ielÄdi jÅ«su analÄ«tiskajÄ modelÄ«.
IlustrÄsim to ar vienkÄrÅ”u Python skriptu, izmantojot Pandas. IedomÄsimies, ka mums ir avota CSV fails ar neapstrÄdÄtiem pasÅ«tÄ«jumiem.
# VienkÄrÅ”ots ETL piemÄrs, izmantojot Python un Pandas
import pandas as pd
# --- IZGUVE ---
print("IzgÅ«st neapstrÄdÄtus pasÅ«tÄ«jumu datus...")
source_df = pd.read_csv('raw_orders.csv')
# --- TRANSFORMAÄCIJA ---
print("TransformÄ datu...")
# 1. Tīri dati
source_df['order_date'] = pd.to_datetime(source_df['order_date'])
source_df['product_price'] = pd.to_numeric(source_df['product_price'], errors='coerce')
source_df.dropna(inplace=True)
# 2. BagÄtiniet datus - Izveidojiet atseviŔķu datuma dimensiju
dim_date = pd.DataFrame({
'DateKey': source_df['order_date'].dt.strftime('%Y%m%d').astype(int),
'Date': source_df['order_date'].dt.date,
'Year': source_df['order_date'].dt.year,
'Quarter': source_df['order_date'].dt.quarter,
'Month': source_df['order_date'].dt.month,
'DayOfWeek': source_df['order_date'].dt.day_name()
}).drop_duplicates().reset_index(drop=True)
# 3. Izveidojiet produktu dimensiju
dim_product = source_df[['product_id', 'product_name', 'category']].copy()
dim_product.rename(columns={'product_id': 'ProductKey'}, inplace=True)
dim_product.drop_duplicates(inplace=True).reset_index(drop=True)
# 4. Izveidojiet faktu tabulu
fact_sales = source_df.merge(dim_date, left_on=source_df['order_date'].dt.date, right_on='Date')
.merge(dim_product, left_on='product_id', right_on='ProductKey')
fact_sales = fact_sales[['DateKey', 'ProductKey', 'order_id', 'quantity', 'product_price']]
fact_sales['TotalRevenue'] = fact_sales['quantity'] * fact_sales['product_price']
fact_sales.rename(columns={'order_id': 'OrderCount'}, inplace=True)
# AgregÄt lÄ«dz vÄlamajam graudam
fact_sales = fact_sales.groupby(['DateKey', 'ProductKey']).agg(
TotalRevenue=('TotalRevenue', 'sum'),
TotalQuantity=('quantity', 'sum')
).reset_index()
# --- IELÄDE ---
print("IelÄdÄ datus mÄrÄ·a krÄtuvÄ...")
# Å ajÄ piemÄrÄ saglabÄsim Parquet failos, ļoti efektÄ«vÄ kolonnu formÄtÄ
dim_date.to_parquet('warehouse/dim_date.parquet')
dim_product.to_parquet('warehouse/dim_product.parquet')
fact_sales.to_parquet('warehouse/fact_sales.parquet')
print("ETL process pabeigts!")
Å is vienkÄrÅ”ais skripts demonstrÄ galveno loÄ£iku. ReÄlÄ pasaulÄ jÅ«s ietÄ«tu Å”o loÄ£iku funkcijÄs un pÄrvaldÄ«tu tÄs izpildi ar orÄ·estrÄtÄju, piemÄram, Airflow.
3. solis: OLAP dzinÄja izvÄle un ievieÅ”ana
Ar jÅ«su datu modelÄÅ”anu un ielÄdi jums ir nepiecieÅ”ams dzinÄjs OLAP operÄciju veikÅ”anai. Python pasaulÄ jums ir vairÄkas jaudÄ«gas iespÄjas, kas galvenokÄrt seko ROLAP pieejai.
A pieeja: vieglais jaudīgais instruments - DuckDB
DuckDB ir process analÄ«tiska datubÄze, kas ir neticami Ätra un viegli lietojama ar Python. TÄ var tieÅ”i vaicÄt Pandas DataFrame vai Parquet failus, izmantojot SQL. TÄ ir ideÄla izvÄle mazÄm un vidÄja mÄroga OLAP sistÄmÄm, prototipiem un vietÄjai izstrÄdei.
TÄ darbojas kÄ augstas veiktspÄjas ROLAP dzinÄjs. JÅ«s rakstÄt standarta SQL, un DuckDB to izpilda ar ÄrkÄrtÄ«gu Ätrumu pÄr jÅ«su datu failiem.
import duckdb
# Savienojiet ar atmiÅas datubÄzi vai failu
con = duckdb.connect(database=':memory:', read_only=False)
# TieÅ”i vaicÄjiet iepriekÅ” izveidotos Parquet failus
# DuckDB automÄtiski saprot shÄmu
result = con.execute("""
SELECT
p.category,
d.Year,
SUM(f.TotalRevenue) AS AnnualRevenue
FROM 'warehouse/fact_sales.parquet' AS f
JOIN 'warehouse/dim_product.parquet' AS p ON f.ProductKey = p.ProductKey
JOIN 'warehouse/dim_date.parquet' AS d ON f.DateKey = d.DateKey
WHERE p.category = 'Electronics'
GROUP BY p.category, d.Year
ORDER BY d.Year;
""").fetchdf() # fetchdf() atgriež Pandas DataFrame
print(result)
B pieeja: mÄkoÅu mÄroga titÄni - Snowflake, BigQuery, Redshift
Lielapjoma uzÅÄmuma sistÄmÄm mÄkoÅu datu noliktava ir standarta izvÄle. Python nemanÄmi integrÄjas ar Ŕīm platformÄm. JÅ«su ETL process ielÄdÄtu datus mÄkoÅu DWH, un jÅ«su Python lietojumprogramma (piemÄram, BI informÄcijas panelis vai Jupyter piezÄ«mju grÄmatas) to vaicÄtu.
LoÄ£ika paliek tÄda pati kÄ ar DuckDB, bet savienojums un mÄrogs ir atŔķirÄ«gi.
import snowflake.connector
# PiemÄrs, kÄ savienoties ar Snowflake un izpildÄ«t vaicÄjumu
conn = snowflake.connector.connect(
user='your_user',
password='your_password',
account='your_account_identifier'
)
cursor = conn.cursor()
try:
cursor.execute("USE WAREHOUSE MY_WH;")
cursor.execute("USE DATABASE MY_DB;")
cursor.execute("""
SELECT category, YEAR(date), SUM(total_revenue)
FROM fact_sales
JOIN dim_product ON ...
JOIN dim_date ON ...
GROUP BY 1, 2;
""")
# IegÅ«stiet rezultÄtus pÄc vajadzÄ«bas
for row in cursor:
print(row)
finally:
cursor.close()
conn.close()
C pieeja: reÄllaika speciÄlisti - Apache Druid vai ClickHouse
LietoÅ”anas gadÄ«jumiem, kas prasa sub-sekundes vaicÄjumu latentumu uz masÄ«vÄm, plÅ«stoÅ”Äm datu kopÄm (piemÄram, reÄllaika lietotÄju analÄ«tika), specializÄtas datubÄzes, piemÄram, Druid vai ClickHouse, ir lieliskas izvÄles. TÄs ir kolonnu datubÄzes, kas paredzÄtas OLAP darba slodzÄm. Python tiek izmantots, lai plÅ«stu datus tajÄs un vaicÄtu tos, izmantojot attiecÄ«gÄs klientu bibliotÄkas vai HTTP API.
4. daļa: praktisks piemÄrs - Mini OLAP sistÄmas veidoÅ”ana
Apvienosim Å”os jÄdzienus mini projektÄ: interaktÄ«vs pÄrdoÅ”anas informÄcijas panelis. Tas demonstrÄ pilnÄ«gu, lai gan vienkÄrÅ”otu, Python balstÄ«tu OLAP sistÄmu.
Mūsu krava:
- ETL: Python un Pandas
- Datu glabÄÅ”ana: Parquet faili
- OLAP dzinÄjs: DuckDB
- InformÄcijas panelis: Streamlit (atvÄrtÄ pirmkoda Python bibliotÄka skaistu, interaktÄ«vu tÄ«mekļa lietotÅu izveidei datu zinÄtnei)
Vispirms palaidiet 3. daļas ETL skriptu, lai izveidotu Parquet failus `warehouse/` direktorijÄ.
PÄc tam izveidojiet informÄcijas paneļa lietojumprogrammas failu, `app.py`:
# app.py - VienkÄrÅ”ots interaktÄ«vs pÄrdoÅ”anas informÄcijas panelis
import streamlit as st
import duckdb
import pandas as pd
import plotly.express as px
# --- Lapas konfigurÄcija ---
st.set_page_config(layout="wide", page_title="GlobÄlais pÄrdoÅ”anas informÄcijas panelis")
st.title("InteraktÄ«vs pÄrdoÅ”anas OLAP informÄcijas panelis")
# --- Savienojums ar DuckDB ---
# Tas tieÅ”i vaicÄs mÅ«su Parquet failus
con = duckdb.connect(database=':memory:', read_only=True)
# --- IelÄdÄt dimensiju datus filtriem ---
@st.cache_data
def load_dimensions():
products = con.execute("SELECT DISTINCT category FROM 'warehouse/dim_product.parquet'").fetchdf()
years = con.execute("SELECT DISTINCT Year FROM 'warehouse/dim_date.parquet' ORDER BY Year").fetchdf()
return products['category'].tolist(), years['Year'].tolist()
categories, years = load_dimensions()
# --- SÄnu josla filtriem (OLAP grieÅ”ana un sadalīŔana!) ---
st.sidebar.header("OLAP filtri")
selected_categories = st.sidebar.multiselect(
'IzvÄlieties produktu kategorijas',
options=categories,
default=categories
)
selected_year = st.sidebar.selectbox(
'IzvÄlieties gadu',
options=years,
index=len(years)-1 # NoklusÄjums uz jaunÄko gadu
)
# --- Veidojiet OLAP vaicÄjumu dinamiskiski ---
if not selected_categories:
st.warning("LÅ«dzu, izvÄlieties vismaz vienu kategoriju.")
st.stop()
query = f"""
SELECT
d.Month,
d.MonthName, -- PieÅemot, ka MonthName pastÄv DimDate
p.category,
SUM(f.TotalRevenue) AS Revenue
FROM 'warehouse/fact_sales.parquet' AS f
JOIN 'warehouse/dim_product.parquet' AS p ON f.ProductKey = p.ProductKey
JOIN 'warehouse/dim_date.parquet' AS d ON f.DateKey = d.DateKey
WHERE d.Year = {selected_year}
AND p.category IN ({str(selected_categories)[1:-1]})
GROUP BY d.Month, d.MonthName, p.category
ORDER BY d.Month;
"""
# --- Izpildiet vaicÄjumu un parÄdiet rezultÄtus ---
@st.cache_data
def run_query(_query):
return con.execute(_query).fetchdf()
results_df = run_query(query)
if results_df.empty:
st.info(f"Nav atrasti dati izvÄlÄtajiem filtriem {selected_year} gadÄ.")
else:
# --- Galvenie informÄcijas paneļa vizuÄlie elementi ---
col1, col2 = st.columns(2)
with col1:
st.subheader(f"MÄneÅ”a ieÅÄmumi par {selected_year}")
fig = px.line(
results_df,
x='MonthName',
y='Revenue',
color='category',
title='MÄneÅ”a ieÅÄmumi pa kategorijÄm'
)
st.plotly_chart(fig, use_container_width=True)
with col2:
st.subheader("IeÅÄmumi pa kategorijÄm")
category_summary = results_df.groupby('category')['Revenue'].sum().reset_index()
fig_pie = px.pie(
category_summary,
names='category',
values='Revenue',
title='KopÄjÄ ieÅÄmumu daļa pa kategorijÄm'
)
st.plotly_chart(fig_pie, use_container_width=True)
st.subheader("DetalizÄti dati")
st.dataframe(results_df)
Lai to palaistu, saglabÄjiet kodu kÄ `app.py` un izpildiet `streamlit run app.py` savÄ terminÄlÄ«. Tas atvÄrs tÄ«mekļa pÄrlÅ«kprogrammu ar jÅ«su interaktÄ«vo informÄcijas paneli. SÄnu joslas filtri ļauj lietotÄjiem veikt OLAP 'grieÅ”anas' un 'sadalīŔanas' operÄcijas, un informÄcijas panelis atjaunojas reÄllaikÄ, atkÄrtoti vaicÄjot DuckDB.
5. daļa: Papildu tÄmas un labÄkÄ prakse
PÄrejot no mini projekta uz ražoÅ”anas sistÄmu, apsveriet Ŕīs papildu tÄmas.
MÄrogojamÄ«ba un veiktspÄja
- Izmantojiet Dask lieliem ETL: Ja jÅ«su avota dati pÄrsniedz jÅ«su maŔīnas RAM, nomainiet Pandas ar Dask savos ETL skriptos. API ir ļoti lÄ«dzÄ«gs, bet Dask apstrÄdÄs Ärpus atmiÅas un paralÄlo apstrÄdi.
- Kolonnu glabÄÅ”ana ir galvenÄ: VienmÄr glabÄjiet savu noliktavas datus kolonnu formÄtÄ, piemÄram, Apache Parquet vai ORC. Tas dramatiski paÄtrina analÄ«tiskos vaicÄjumus, kuriem parasti ir nepiecieÅ”ams nolasÄ«t tikai dažas kolonnas no plaÅ”as tabulas.
- ParticionÄÅ”ana: UzglabÄjot datus datu ezerÄ (piemÄram, S3 vai vietÄjÄ failu sistÄmÄ), sadaliet datus mapÄs, pamatojoties uz bieži filtrÄtu dimensiju, piemÄram, datumu. PiemÄram: `warehouse/fact_sales/year=2023/month=12/`. Tas ļauj vaicÄjumu dzinÄjiem izlaist nevajadzÄ«gu datu lasīŔanu, process, kas pazÄ«stams kÄ "partÄ«ciju apgrieÅ”ana".
Semantiskais slÄnis
SistÄmai augot, jÅ«s atradÄ«siet, ka biznesa loÄ£ika (piemÄram, "AktÄ«vÄ lietotÄja" vai "Bruto peļÅas") definÄ«cija tiek atkÄrtota vairÄkos vaicÄjumos un informÄcijas paneļos. Semantiskais slÄnis to atrisina, nodroÅ”inot centralizÄtu, konsekventu jÅ«su biznesa metrikas un dimensiju definÄ«ciju. TÄdi rÄ«ki kÄ dbt (Data Build Tool) ir izcili Å”im nolÅ«kam. Lai gan tas nav pats par sevi Python rÄ«ks, dbt lieliski integrÄjas Python orÄ·estrÄtÄ darba plÅ«smÄ. JÅ«s izmantojat dbt, lai modelÄtu savu zvaigžÅu shÄmu un definÄtu metrikas, un pÄc tam Python var izmantot, lai orÄ·estrÄtu dbt skrÄjienus un veiktu papildu analÄ«zi uz iegÅ«tajÄm tÄ«rajÄm tabulÄm.
Datu pÄrvaldÄ«ba un kvalitÄte
Noliktava ir tikpat laba kÄ tajÄ esoÅ”ie dati. IntegrÄjiet datu kvalitÄtes pÄrbaudes tieÅ”i savos Python ETL cauruļvados. BibliotÄkas, piemÄram, Great Expectations, ļauj definÄt "izredzes" par jÅ«su datiem (piemÄram, `customer_id` nekad nedrÄ«kst bÅ«t null, `revenue` jÄbÅ«t starp 0 un 1 000 000). JÅ«su ETL uzdevums pÄc tam var neizdoties vai brÄ«dinÄt jÅ«s, ja ienÄkoÅ”ie dati pÄrkÄpj Å”os lÄ«gumus, novÄrÅ”ot sliktu datu sabojÄt jÅ«su noliktavu.
NoslÄgums: Koda pirmÄs pieejas spÄks
Python ir fundamentÄli mainÄ«jis datu noliktavu un Business Intelligence ainavu. Tas nodroÅ”ina elastÄ«gu, jaudÄ«gu un piegÄdÄtÄjam neitrÄlu rÄ«ku komplektu, lai no nulles veidotu sarežģītas analÄ«tiskÄs sistÄmas. Apvienojot labÄkÄs klases bibliotÄkas, piemÄram, Pandas, Dask, SQLAlchemy un DuckDB, jÅ«s varat izveidot pilnÄ«gu OLAP sistÄmu, kas ir gan mÄrogrojama, gan uzturama.
Ceļojums sÄkas ar stingru izpratni par datu modelÄÅ”anas principiem, piemÄram, zvaigžÅu shÄmu. No turienes jÅ«s varat veidot izturÄ«gus ETL cauruļvadus, lai veidotu savus datus, izvÄlÄties pareizo vaicÄjumu dzinÄju savam mÄrogam un pat veidot interaktÄ«vas analÄ«tiskÄs lietojumprogrammas. Å Ä« koda pirmÄ pieeja, kas bieži vien ir "ModernÄs datu krauto" pamatprincips, nodroÅ”ina analÄ«tikas jaudu tieÅ”i izstrÄdÄtÄju un datu komandu rokÄs, ļaujot tÄm veidot sistÄmas, kas ir perfekti pielÄgotas viÅu organizÄcijas vajadzÄ«bÄm.